10
תגובות

מה אומר הפקודה return $this

פתח tal22288 ,
במהלך לימוד הOOP שלי בשפה PHP נתקלתי בפקודה הבאה :
return $this;

חיפשתי הסברים אך לא מצאתי הסבר מדויק או הסבר טוב ...

ואיך היא בא לידי ביטוי בקוד פה :

public function check($source , $items = array()){
 
    foreach($items as $item => $rules){
     
      foreach($rules as $rule => $rule_value){
     
        $value = $source[$item];
       
        if($rule === "required" && empty($value)){
          self::addError("$item is required");
        }else if(!empty($value)){
          switch($rule){
            case "min":
              if(strlen($value) < $rule_value){
                self::addError("$item must at least of $rule_value characters.");
              }
            break;
            case "max":
              if(strlen($value) > $rule_value){
                self::addError("$item must less then  $rule_value characters.");
              }    
            break;
            case "matches":
              if($value != $source[$rule_value]){
                self::addError("$rule_value must match $item");
              }
            break;
           
           
          }
        }
     
      }
    }
   
    if(empty(self::$_errors)){
      $this->_passed = true;
    }
   
    return $this;
  }


אשמח להסבר , תודה !

10 תשובות

avatar ענה zacharya ב 12 לנובמבר 2013 #

$this בעצם היא "משתנה המחלקה".
בתוך משתנה זה ניתן לגשת לכל פונקציה ומשתנה של המחלקה מתוך המחלקה עצמה, כאשר אנחנו עושים return $this; אז אנחנו מחזירים בעצם את המשתנה המכיל את כל המחלקה, למשל שים לב לזה:

<?php
    class a{
        public $b = 5;
        public function a(){
            $this->b = $this->b + 1;
            return $this;
        }
    }
   
    $a = new a();
    $b = $a->a();
    echo $b->b;
?>


כאשר אנחנו מחזירים THIS אנחנו נותנים למשתנה שאליו הכנסו את THIS את הגישה לכל המחלקה בעצם, הבנת?

avatar ענה tal22288 ב 12 לנובמבר 2013 #

אז למשתנה אנחנו מחזירים את כל המשתנים של המחלקה ? ( ממממ... טיפה מסובך ... יש לך הסבר מפורט יותר ? )
תודה !

avatar ענה zacharya ב 12 לנובמבר 2013 #

בוא נקרא לזה מפתח.
נניח ויש לך בית מסוים שמכיל בתוכו כל מיני חפצים, אם יש לנו את המפתח נוכל לפתוח את הדלת ולהכנס לתוך ובית וכמובן להשתמש בחפצים נכון?
אז $this הוא בעצם מפתח לכל המחלקה, אך הוא פועל אך ורק בתוך המחלקה. כלומר שתוכל לקורא למפתח של הבית בשביל חפץ מסוים רק אם הקריאה היא מתוך הבית, מובן?
כאשר אנחנו עושים return למפתח אנחנו נותנים את האפשרות להשתמש במפתח מחוץ למחלקה.

הבנת או שאצטרך להסביר אחרת?

avatar ענה OrelBeY ב 12 לנובמבר 2013 #

אובייקט, לא מחלקה. זה חשוב מאוד. מדובר במצב המסוים של המחלקה - האובייקט המדובר.

avatar ענה tal22288 ב 14 לנובמבר 2013 #

אוקי , zacharya הבנתי ....
אך יש לי עוד שאלה , בהסבר שלך הסברת על $this כאשר הוא ניגש למשתנה לדוגמה :

return $this->b;

שאת זה הבנתי הסבר מצוין דרך אגב !
אך מה קורה כאשר ה $this לא פונה לאף משתנה ? , כמו בדוגמה בתגובתי הראשונה :
return $this;

תודה !

avatar ענה OrelBeY ב 14 לנובמבר 2013 #

זה מחזיר מצביע לכל האובייקט. לכולו.

avatar ענה tal22288 ב 14 לנובמבר 2013 #

אוביקט = עצם ?

avatar ענה OrelBeY ב 14 לנובמבר 2013 #

אכן. :)
מצב של מחלקה, מופע של מחלקה, איך שלא תקרא לזה.
חשוב לציין שזה לא מעתיק את האובייקט, אלא מחזיר מצביע (Reference) לאובייקט. אני אערוך עוד מעט עם דוגמה.

avatar ענה tal22288 ב 14 לנובמבר 2013 #

אוקי תודה רבה !
מחכה לדוגמה :)

avatar ענה OrelBeY ב 14 לנובמבר 2013 #

הנה דוגמה, אני מקווה שהיא מספיק טובה:

class Counter {
    private $counter = 0;
   
    public function increment() {
        $this->counter++;
        return $this;
    }
   
    public function getCount() {
        return $this->counter;
    }
}

$counter = new Counter();
$anotherCounter = $counter->increment();
echo "counter: " . $counter->getCount() . "\n";
echo "anotherCounter: " . $anotherCounter->getCount() . "\n\n";

$anotherCounter->increment();
echo "counter: " . $counter->getCount() . "\n";
echo "anotherCounter: " . $anotherCounter->getCount() . "\n";


כאן אתה יכול לראות את זה פועל.